package cn.ava.ymcc.service.impl;

import cn.ava.ymcc.constants.CommonConstants;
import cn.ava.ymcc.domain.Login;
import cn.ava.ymcc.dto.LoginParamDto;
import cn.ava.ymcc.dto.LoginTokenInfoDto;
import cn.ava.ymcc.dto.RefreshTokenDto;
import cn.ava.ymcc.mapper.LoginMapper;
import cn.ava.ymcc.result.JSONResult;
import cn.ava.ymcc.service.ILoginService;
import cn.ava.ymcc.utils.AssertUtil;
import cn.ava.ymcc.utils.HttpUtil;
import cn.ava.ymcc.utils.LoginInfoContextUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * <p>
 * 登录表 服务实现类
 * </p>
 *
 * @author ava
 * @since 2022-08-04
 */
@Service
@Slf4j
public class LoginServiceImpl extends ServiceImpl<LoginMapper, Login> implements ILoginService {

    /**
     *
     * @param dto
     * @return
     */
    @Override
    public JSONResult goLogin(LoginParamDto dto) {
        Integer type = dto.getType();
        String username = dto.getUsername();
        String password = dto.getPassword();
        String clientId = CommonConstants.TokenConstant.CLIENT_ID;
        String secret = CommonConstants.TokenConstant.SECRET;
        if (type == 1) {
            // 前台用户登录
            clientId = "website";
            secret = "2353";
        }else if (type == 0){
            // 后台管理端登录
            clientId = "admin";
            secret = "2353";
        }
        // 校验合法性
        AssertUtil.isNotNull(clientId,"非法请求!");
        String tokenURL = String.format(CommonConstants.TokenConstant.TOKEN_URL,
                        clientId,
                        secret,
                        username,
                        password);
        // 发送http请求获取token
        String sendPost = HttpUtil.sendPost(tokenURL, null);
        // 封装用户信息map返回前端
        Map map = JSONObject.parseObject(sendPost, Map.class);
        // 校验是否成功
        if(sendPost.contains("error_description")){
            return JSONResult.error("用户名或密码错误!");
        }else{
            // 返回token过期时间
            map.put("expiresTime",System.currentTimeMillis() + Long.parseLong(map.get("expires_in").toString()));
            return JSONResult.success(map);
        }
    }


    /**
     * 解决token过期问题,自动刷新
     * @param dto
     * @return
     */
    @Override
    public JSONResult refreshToken(RefreshTokenDto dto) {
        // JSR303非空校验
        String clientId = CommonConstants.TokenConstant.CLIENT_ID;
        String secret = CommonConstants.TokenConstant.SECRET;
        LoginTokenInfoDto loginContext = LoginInfoContextUtil.getLoginContext();
        // 校验用户是否正确
        boolean isLogin = loginContext.getUsername().equals(dto.getUsername());
        AssertUtil.isTrue(isLogin,"登录信息异常!");
        // 拼接token
        clientId = "admin";
        secret = "2353";
        String tokenURL = String.format(CommonConstants.TokenConstant.REFRESH_TOKEN,
                dto.getRefreshToken(),
                clientId,
                secret
                );
        // 发送http请求获取token
        String sendPost = HttpUtil.sendPost(tokenURL, null);
        // 封装用户信息map返回前端
        Map map = JSONObject.parseObject(sendPost, Map.class);
        // 校验是否成功
        if(sendPost.contains("error_description")){
            return JSONResult.error("非法请求!");
        }else{
            // 返回token过期时间
            map.put("expiresTime",System.currentTimeMillis() + Long.parseLong(map.get("expires_in").toString()));
            log.info("刷新token");
            return JSONResult.success(map);
        }
    }


}
